/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.stefanini.informacion_mundialista.ejbs;

import com.stefanini.informacion_mundialista.Grupo;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author CarlosAlberto
 */
@LocalBean
@Stateless
public class GroupManager {
    @PersistenceContext
    private EntityManager em;

        /**
     * Verifica si un grupo ya existe a partir de su nombre. Retorna true si el
     * grupo ya existe, false en caso contrario
     *
     * @param nombreGrupo
     * @return
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public boolean verificarGrupoExistente(String nombreGrupo) {
        try {
            StringBuilder query = new StringBuilder();
            query.append("SELECT g FROM Grupo g ");
            query.append("WHERE g.nombre = :NOMBRE_GRUPO ");

            Query q = em.createQuery(query.toString(), Grupo.class);
            q.setParameter("NOMBRE_GRUPO", nombreGrupo);

            q.getSingleResult();
            return true;

        } catch (NoResultException e) {
            Logger.getLogger(GroupManager.class.getName()).log(Level.SEVERE,
                    "No se encontraron grupos con el nombre indicado");
            return false;
        } catch (Exception e) {
            Logger.getLogger(GroupManager.class.getName()).log(Level.SEVERE,
                    "Error al verificar la existencia del grupo", e);
            return false;
        }
    }
            /**
     * Consulta todos los grupos disponibles en la base de datos
     *
     * @return
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Grupo> getAllGrupos() {
        try {
            Query q = em.createNamedQuery("Grupo.findAll");

            return q.getResultList();

        } catch (Exception e) {
            Logger.getLogger(GroupManager.class.getName()).log(Level.SEVERE,
                    "Error al consultar los grupos", e);
            return new ArrayList<>();
        }
    }
            /**
     * Consulta todos los grupos disponibles en la base de datos
     * Por Nombre
     * @return
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Grupo> getAllGruposNombres() {
        try {
            Query q = em.createNamedQuery("Grupo.findAllforName");

            return q.getResultList();

        } catch (Exception e) {
            Logger.getLogger(GroupManager.class.getName()).log(Level.SEVERE,
                    "Error al consultar los grupos", e);
            return new ArrayList<>();
        }
    }
       /**
     * Guarda un grupo en la base de datos
     * @param grupo
     * @param isEdit 
     * @return 
     *      true si el grupo fue guardado exitosamente, false en caso contrario
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public boolean guardarGrupo(Grupo grupo, boolean isEdit) {
        try {
            if(isEdit) {
                em.merge(grupo);
            } else {
                em.persist(grupo);                
            }
            em.flush();
            return true;
        } catch (Exception e) {
            Logger.getLogger(GroupManager.class.getName()).log(Level.SEVERE,
                    "Error al guardar el grupo", e);
            return false;
        }
    }

}
